home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
001
/
68k8080m.arc
/
COM1A.ASM
next >
Wrap
Assembly Source File
|
1986-03-25
|
22KB
|
882 lines
*************************************************************************
* *
* *
* 8080 Simulator for MC68000 *
* *
* With CP/M 2.2 call support, optional tracing and *
* Morrow HDDMA DMA buffer translating. *
* *
* *
* Version 1.2 1/21/85 JEC *
* Fixed Extent bug in OPEN logic. *
* Sped up code, sample MAC from 2:13 to 1:40. *
* Now runs at a 1.4 MHz equivalent based on MAC sample. *
* *
* Version 1.1 8/29/84 JEC *
* Fixed BDOS call #6 bug. *
* *
* Version 1.0 05/25/84 by Jim Cathey *
* *
* This program has been written for speed wherever possible, *
* as such tends to be large because of the separate subroutine *
* for each and every opcode of the target processor. *
* *
* On an 8MHz 68000 (Compupro) system the simulation speed is *
* a little better than a 1MHz Z-80 when running MAC. The time *
* for a sample assembly was 2:13 for the simulation vs 0:35 *
* on a 4MHz Z-80, both systems used identical hard disk systems. *
* *
* It is not a complete simulation, as some flag handling *
* isn't quite right, but it is enough to run the programs *
* I wrote it for (DDT, LU, MAC, and Morrow's FORMATMW). *
* *
*************************************************************************
text
page
*************************************************************************
* *
* This file contains the startup routines, the simulator core, *
* tracing code, and the CP/M 2.2 simulation. *
* *
*************************************************************************
xdef optabl,flags,mnops
globl mloop,illegl,service
*
* Conditional assembly flags.
*
trace equ 0 ; Non-zero for trace routine inclusion.
trcdsk equ 0 ; Non-zero for FCB trace routine inclusion.
dmpdsk equ 0 ; Non-zero for register dump in FCB trace.
* !! diskio is in file COM2.S !!
*diskio equ 0 ; Non-zero for special HDDMA support.
*
* Register definitions for the simulation.
*
return equ @16,r ; JMP (return) is fast return to MLOOP.
pseudopc equ @15,r ; 8080's PC is register A5.
opptr equ @14,r ; Pointer to opcode dispatch table.
pseudosp equ @13,r ; 8080's SP is register A3.
flagptr equ @12,r ; Pointer to 8080's flag lookup table is A2.
targbase equ @11,r ; Pointer to 8080's address space is A1.
regs equ @11,r ; Base pointer to 8080's registers is A1.
regcon0e equ 7,r ; Register based constant #$E (for speed).
regcon01 equ 6,r ; Register based constant #$1.
regcon0f equ 5,r ; Register based constant #$F.
regconff equ 4,r ; Register based constant #$FF.
regf equ 3,r ; 8080's Flags
rega equ 2,r ; 8080's Accumulator
*
* Note, only leaves D0-D1/A0 for free use by entire
* program without saving registers for temporary use.
*
bdos .opd 0,$4e42 ; BDOS 'macro'.
bios .opd 0,$4e43 ; BIOS 'macro'.
page
*************************************************************************
* *
* Initialization and Main Opcode dispatcher. *
* *
*************************************************************************
start lea.l target,targbase ; Start of target memory.
ifne trace ; Optional trace code.
bsr entrads ; Enter trace delimiting addresses
* ; if the code is desired.
endc
bsr lodfdos ; Load up the fake FDOS in target mem.
bsr lodregs ; Load the remaining simulation registers.
bsr loadcom ; Load the .COM program,
tst d0 ; quit if unsuccessful.
bne optprnt
rts
optprnt equ *
ifne trcdsk ; If FCB tracing, print header.
lea.l fcbmsg,a0
bsr lpstr
endc
mloop: * ; Execute simulation
~~mloop:
ifne trace ; Optional trace.
tst traceflg
bne dotrace
cmpa.l tracesad,pseudopc
bne notrace
move.b #1,traceflg
dotrace bsr dump
cmpa.l traceead,pseudopc
bne notrace
move.b #0,traceflg
notrace equ *
endc
moveq #0,d0 ; Execute appropriate simulation subroutine.
move.b (pseudopc)+,d0 ; Grab next opcode.
asl #2,d0 ; (D0 high word is still 0!)
move.l 0(opptr,d0.w),a0
jmp (a0) ; To the subroutine.
page
*************************************************************************
* *
* Illegal instructions and Dumping. *
* *
*************************************************************************
illegl move.l #illgmsg,d1 ; Illegal opcode, say what & where,
move.w #9,d0
bdos
lea.l -1(pseudopc),a0
move.b (a0),d1
suba.l targbase,a0
bsr pbyte
move.l #ilgmsg2,d1
move.w #9,d0
bdos
move.l a0,d1
bsr pword
move.l #ilgmsg3,d1
move.w #9,d0
bdos
move.l #dumpmsg,d1
move.w #9,d0
bdos
bsr dump ; and spill guts.
rts ; Quit simulation.
page
dump movem.l d0-d1/a0,-(sp)
move.l #dmpmsg2,d1 ; Dump all registers,
move.w #9,d0 ; used for illegals and tracing.
bdos
move.b rega,d1
bsr pbyte
move.b regf,d1
bsr pbyte
bsr pspace
move.w regb(regs),d1
bsr pword
bsr pspace
move.w regd(regs),d1
bsr pword
bsr pspace
move.w regh(regs),d1
bsr pword
bsr pspace
move.l pseudosp,d1
sub.l targbase,d1
bsr pword
bsr pspace
move.l pseudosp,a0
swap d2 ; Save REGA
move.w #3,d2
tosloop move.b 1(a0),d1
ror.w #8,d1
move.b 0(a0),d1
bsr pword
bsr pspace
addq.l #2,a0
dbra d2,tosloop
swap d2
move.l pseudopc,d1
sub.l targbase,d1
bsr pword
bsr pspace
bsr pspace
move.b (pseudopc),d1
bsr pbyte
bsr pspace ; Now show mnemonic
bsr pspace
moveq #0,d0
move.b (pseudopc),d0
asl.w #2,d0
lea.l mnops,a0
move.l (a0,d0.l),d1
move.l d1,-(sp)
inc.l d1
move #9,d0
bdos
move.l (sp)+,a0
cmp.b #" ",(a0)
beq nooprnd
cmp.b #"C",(a0)
bne notcons
move.b 1(pseudopc),d1
bsr pbyte
bra nooprnd
notcons cmp.b #"A",(a0)
bne nooprnd
move.b 2(pseudopc),d1
bsr pbyte
move.b 1(pseudopc),d1
bsr pbyte
nooprnd bsr pspace ; In case of conout calls during trace,
bsr pspace ; they will be visible at end of line.
bsr pspace
movem.l (sp)+,d0-d1/a0
rts
page
*************************************************************************
* *
* Initialization subroutines. *
* *
*************************************************************************
lodfdos lea.l fdos,a6 ; Load up the fake FDOS.
move.l targbase,pseudosp
adda.l #$10000,pseudosp
lea.l -256(pseudosp),a0
move.w #fdoslen,d0
lodloop move.b (a6)+,(a0)+
dbra d0,lodloop
lea.l -256(pseudosp),a0
move.l a0,d0
sub.l targbase,d0
move.b #$c3,0(targbase) ; Build BIOS & BDOS jumps.
move.b #$c3,5(targbase)
move.b d0,6(targbase)
rol.w #8,d0
move.b d0,7(targbase)
rol.w #8,d0
add.w #3,d0
move.b d0,1(targbase)
rol.w #8,d0
move.b d0,2(targbase)
move.w #0,-(pseudosp) ; Set up a return stack to exit simulation.
rts
lodregs lea.l optabl,opptr ; Point base register to opcode dispatch table.
lea.l mloop,return
lea.l flags,flagptr
move.l targbase,pseudopc
adda.l #$100,pseudopc ; Start execution at 0100H in target space.
moveq #$e,regcon0e ; Set up quick constants.
moveq #$1,regcon01
moveq #$f,regcon0f
move.l #$ff,regconff
moveq #0,rega
moveq #0,regf
rts
page
entrads move.l #tracemsg,d1 ; Enter trace address if necessary.
move.w #9,d0
bdos
bsr atol ; Get trace start address.
and.l #$ffff,d1
move.l d1,a0
adda.l targbase,a0
move.l a0,tracesad
move.l #tracemg2,d1
move.w #9,d0
bdos
bsr atol ; Get trace end address.
and.l #$ffff,d1
move.l d1,a0
adda.l targbase,a0
move.l a0,traceead
move.w #10,d1 ; CRLF to end line.
move.w #2,d0
bdos
move.w #13,d1
move.w #2,d0
bdos
rts
*
* OPEN file to be loaded, and load it into target
* space if successful.
*
loadcom link a6,#0 ; Mark stack frame.
movem.l d2-d3/a2-a4,-(sp)
move.l 12(a6),a0 ; Get the address of the base page.
lea.l $5c(a0),a2 ; Get FCB address.
move.b #'C',9(a2) ; mash filename to .COM
move.b #'O',10(a2)
move.b #'M',11(a2)
move.l a2,d1
move.w #15,d0
bdos ; OPEN file.
cmpi.w #255,d0 ; ERROR?
beq openerr
move.l pseudopc,d2 ; Start loading at $0100 in target.
filelod move.l d2,d1 ; Set DMA address.
move.w #26,d0
bdos
move.l a2,d1
move.w #20,d0 ; Read file until EOF.
bdos
tst d0
bne basepg
add.l #128,d2
bra filelod
basepg lea.l $80(targbase),a2 ; Set up the target's base page.
move.l a2,d1 ; Start with default DMA address.
move.l a2,dmaaddr
move.w #26,d0
bdos
lea.l $38(a0),a2
lea.l $5c(targbase),a3 ; Copy host's 2nd FCB to target's 1st FCB.
move.w #36,d0
fcbloop move.b (a2)+,(a3)+
dbra d0,fcbloop
lea.l $80(a0),a2
lea.l $80(targbase),a4
lea.l $81(targbase),a3
clr d0
move.b d0,(a4)
move.b (a2)+,d0 ; Grab command tail from host's buffer.
tail1 cmp.b #$20,(a2)+ ; Hack off ?.COM filename.
dbeq d0,tail1
bne loaded ; If there's any tail left, then
tail2 cmp.b #$20,(a2)+ ; remove leading whitespace.
dbne d0,tail2
beq loaded
dec.l a2
subq #2,d0
tail3 move.b (a2)+,(a3)+ ; Move the rest of the tail.
inc.b (a4)
dbra d0,tail3
move.b #0,(a3)
bra loaded
openerr move.l #opnmsg,d1 ; Can't open file.
move.w #9,d0
bdos
clr d0
loaded movem.l (sp)+,d2-d3/a2-a4
unlk a6 ; Trantor.
rts
page
*************************************************************************
* *
* BIOS and BDOS service request handler. *
* *
*************************************************************************
service moveq #0,d0 ; Handle BIOS/BDOS service request
move.b (pseudopc)+,d0 ; of form HLT DB opcode.
bne biosfn ; BDOS or BIOS?
bdosfn moveq #0,d1
move.b regc(regs),d0 ; Get BDOS function number.
move.w regd(regs),d1 ; Get argument.
cmp #31,d0 ; Can't do Disk Parm Hdr function
beq badbdos
cmp #27,d0 ; or ALLOC vector fn.
bne okbdos
badbdos move.l #ilgbdos,d1
move.w #9,d0
bdos
bsr dump
bra quitprg
okbdos cmp #9,d0 ; Translate target address to real address.
blt noconv
cmp #14,d0
beq noconv
cmp #32,d0
beq noconv
cmp #37,d0
beq noconv
add.l targbase,d1
noconv cmp #26,d0 ; Save last known DMA address
bne notdma ; (in case of OPEN processing).
move.l d1,dmaaddr
notdma move.b #0,fcbflag ; Separate FCB type requests
cmp #15,d0 ; from the rest of the swine.
blt notfcb ; (Assume not, at first).
cmp #24,d0
blt fcb
cmp #30,d0
beq fcb
cmp #33,d0
blt notfcb
cmp #37,d0
blt fcb
cmp #40,d0
beq fcb
bra notfcb
page
fcb swap d2
move.w #35,d2 ; Move the FCB to host working buf,
move.l d1,a0
move.l a1,-(sp)
lea.l fcbstor,a1
fcb1 move.b (a0)+,(a1)+
dbra d2,fcb1
move.l (sp)+,a1
lea.l fcbstor,a0 ; and swap the random record bytes
move.b 33(a0),d2 ; to make them match the 68000's.
move.b 35(a0),33(a0)
move.b d2,35(a0)
swap d2
move.b #1,fcbflag ; Set flag for proper recovery.
move.l d1,-(sp) ; (Gotta put the pig back in pen!)
move.l a0,d1
ifne trcdsk
ifne dmpdsk ; Optional^2 Register dump.
bsr dump
endc
endc
cmp.w #15,d0 ; OPEN has a problem in that CP/M-68K
bne notopen ; can only open the base extent, unlike
tst.b 12(a0) ; CP/M-80. So we have to check and do
beq notopen ; an OPEN then SEEK (RREAD) if required.
bsr openproc
bra results
notopen:
~~notopen:
ifne trcdsk ; Optional FCB trace.
move.l d2,-(sp)
move.b #' ',d2
bsr fcbtrc1
move.l (sp)+,d2
endc
notfcb cmp #6,d0 ; Not an FCB request. Is it
bne notdcon ; a direct console I/O function?
cmp.b #$ff,d1 ; Yes, make host's look like target's.
bne notdcon
move.w #$fe,d1
bdos
tst d0
beq results
move.w #6,d0
move.w #$FF,d1
notdcon bdos ; FINALLY! Do the translated function.
results move.w d0,regh(regs)
move.b d0,rega
move.b regh(regs),regb(regs)
tst.b fcbflag ; Do we need to restore a FCB?
beq done
ifne trcdsk
bsr fcbtrc2
endc
lea.l fcbstor,a0 ; Restore the FCB to target, in proper order.
swap d2
move.b 33(a0),d2
move.b 35(a0),33(a0)
move.b d2,35(a0)
move.l (sp)+,a0
move.l a1,-(sp)
lea.l fcbstor,a1
move.w #35,d2
fcb2 move.b (a1)+,(a0)+
dbra d2,fcb2
swap d2
move.l (sp)+,a1
done move.b rega,d0
and.w regconff,d0
move.b 0(flagptr,d0.w),regf
rts
openproc:
~~openproc:
ifne trcdsk ; Optional FCB trace.
swap d2
move.b #' ',d2
bsr fcbtrc1
swap d2
bsr fcbtrc2a
endc
move.b 33(a0),-(sp) ; Save away RR fields!
move.b 34(a0),-(sp)
move.b 35(a0),-(sp)
movem.l d0-d2,-(sp)
moveq #0,d2
move.b 12(a0),d2 ; Save desired extent.
clr.b 12(a0)
bsr fcbbdos ; Do BDOS (with opt. tracing).
tst.b d0
bmi badopen ; No seek if not good OPEN.
asl.l #7,d2 ; Make EXTENT # into record offset.
moveq #0,d0
move.b 32(a0),d0
bclr #7,d0
add.l d2,d0 ; Add onto CR to make abs record #.
move.w d0,34(a0) ; Put into FCB.
swap d0
move.b d0,33(a0)
move.l #junkbuf,d1 ; Set DMA addr elsewhere for Rand Seek.
move.w #26,d0
bdos
movem.l (sp)+,d0-d2
move.w #33,d0 ; Random READ (SEEK) desired extent.
bsr fcbbdos ; Do BDOS (with opt. tracing).
clr d0 ; (OPEN) must always be successful because
* ; of the way CP/M-80 & CP/M-68K differ
* ; on OPENing non-zero extents.
movem.l d0-d1,-(sp) ; Restore the proper DMA address.
move.w #26,d0
move.l dmaaddr,d1
bdos
movem.l (sp)+,d0-d1
restore move.b (sp)+,35(a0) ; Restore RR fields.
move.b (sp)+,34(a0)
move.b (sp)+,33(a0)
rts
badopen movem.l (sp)+,d0-d2
bra restore
fcbbdos:
~~fcbbdos:
ifne trcdsk ; BDOS call with optional FCB trace.
move.l d2,-(sp)
move.b #'+',d2
bsr fcbtrc1
move.l (sp)+,d2
endc
bdos
ifne trcdsk
bsr fcbtrc2
endc
rts
biosfn cmp #1,d0 ; Handle Bios calls.
beq quitprg
cmp #$f,d0 ; List Status is ok.
beq gudbios
cmp #7,d0
bge badbios ; Don't allow disk functions!
gudbios clr.w d1
move.b regc(regs),d1
movem.l d2-d7/a0-a6,-(sp)
bios
movem.l (sp)+,d2-d7/a0-a6
move.b d0,rega
rts
badbios move.b d0,-(sp) ; Flag illegal BIOS call
move.l #biosmsg,d1 ; and spill guts.
move.w #9,d0
bdos
move.b (sp)+,d1
bsr pbyte
move.l #biosmg2,d1
move.w #9,d0
bdos
bsr dump
quitprg move.l (sp)+,d0 ; Trash return address and
rts ; quit simulation.
page
*************************************************************************
* *
* FCB Tracing support routines. *
* *
*************************************************************************
ifne trcdsk
fcbtrc1 movem.l d0-d2/a0,-(sp) ; Dump to printer each FCB usage
move.b #9,d1 ; in format FN #, Disk, Name (ASCII)
bsr lpchar ; and the rest, all in hex but the
move.w d0,d1 ; name field. Print the returned
bsr lpbyte ; value after the FCB.
move.b d2,d1 ; Char in D2 is printed after FN #.
bsr lpchar
bsr lpspace
bsr lpspace
move.b (a0)+,d1
bsr lpbyte
bsr lpspace
move.w #10,d2
fcbtr1 move.b (a0)+,d1 ; Print Name field...
bsr lpchar
dbra d2,fcbtr1
bsr lpspace
move.w #3,d2
fcbtr2 move.b (a0)+,d1 ; Ex .. Rc
bsr lpbyte
bsr lpspace
dbra d2,fcbtr2
bsr lpspace
bsr lpspace
lea.l 16(a0),a0 ; Skip d0..dn field.
move.w #3,d2
fcbtr3 move.b (a0)+,d1 ; CR .. R2
bsr lpbyte
bsr lpspace
dbra d2,fcbtr3
bsr lpspace
bsr lpspace
move.l dmaaddr,d1
sub.l targbase,d1
bsr lpword
bsr lpspace
movem.l (sp)+,d0-d2/a0
rts
page
fcbtrc2 movem.l d0-d1,-(sp) ; Line termination of FCB trace.
bsr lpspace
bsr lpspace
move.b d0,d1
bsr lpbyte
fcbtr21 move.b #10,d1
bsr lpchar
move.b #13,d1
bsr lpchar
movem.l (sp)+,d0-d1
rts
fcbtrc2a:
movem.l d0-d1,-(sp) ; Line termination if no result
bra fcbtr21 ; is to be presented.
endc
page
*************************************************************************
* *
* Misc. service routines. *
* (Inelegant, but rarely used so they stand as is). *
* *
*************************************************************************
pbyte move.l #$20018,d0 ; 2 nybbles, 24 bit shift first.
bra pdigits
pword move.l #$40010,d0 ; 4 nybbles, 16 bit shift first.
bra pdigits
paddr move.l #$60008,d0 ; 6 nybbles, 8 bit shift first.
bra pdigits
plong move.l #$80000,d0 ; 8 nybbles, no shift first.
pdigits rol.l d0,d1 ; Do shift.
bra pdigent
pdiglop swap d0 ; Save nybble count.
rol.l #4,d1 ; Print variable in d1.
bsr ntoa
pdigent swap d0 ; Get nybble count.
dbra d0,pdiglop
rts
ntoa movem.l d0-d1,-(sp) ; Nybble in d1 to ASCII, then output.
and #$f,d1
cmp #$a,d1
blt ntoa2
add.b #'A'-'9'-1,d1
ntoa2 add.b #'0',d1
move.w #2,d0
bdos
movem.l (sp)+,d0-d1
rts
pspace move.w #32,d1 ; Print a space.
move.w #2,d0
bdos
rts
page
*
* Line Printer versions of above
*
lpbyte move.l #$20018,d0 ; 2 nybbles, 24 bit shift first.
bra lpdigts
lpword move.l #$40010,d0 ; 4 nybbles, 16 bit shift first.
bra lpdigts
lpaddr move.l #$60008,d0 ; 6 nybbles, 8 bit shift first.
bra lpdigts
lplong move.l #$80000,d0 ; 8 nybbles, no shift first.
lpdigts rol.l d0,d1 ; Do shift.
bra lpdgent
lpdiglp swap d0 ; Save nybble count.
rol.l #4,d1 ; Print variable in d1.
bsr lntoa
lpdgent swap d0 ; Get nybble count.
dbra d0,lpdiglp
rts
lntoa movem.l d0-d1,-(sp) ; Nybble in d1 to ASCII, then output.
and #$f,d1
cmp #$a,d1
blt lntoa2
add.b #'A'-'9'-1,d1
lntoa2 add.b #'0',d1
lntoa3 move.w #5,d0
bdos
movem.l (sp)+,d0-d1
rts
lpchar movem.l d0-d1,-(sp) ; Print a character.
bra lntoa3
lpspace movem.l d0-d1,-(sp) ; Print space.
move.w #32,d1
bra lntoa3
page
*
* Remaining misc. service routines.
*
lpstr movem.l d0-d1,-(sp) ; Print a null-terminated string.
lpstr1 move.b (a0)+,d1
beq lpstr2
bsr lpchar
bra lpstr1
lpstr2 movem.l (sp)+,d0-d1
rts
konin move.w #1,d0 ; Console input for 'atol'.
bdos
rts
atol moveq #0,d1 ; ASCII to long, stops on invalid hex char.
clr d2 ; Returns long in d1, terminator char in d0,
atol1 bsr konin ; d2=1 if any chars entered before terminator.
cmp.b #$40,d0
blo atol2
and #$5F,d0 ; Mask to upper case.
atol2 cmpi.b #'0',d0 ; Check range (0..9,A..F).
blo atolend
cmpi.b #'F',d0
bhi atolend
cmpi.b #'9',d0
bls atol3
cmpi.b #'A',d0
bhs atol3
bra atolend
atol3 moveq #1,d2 ; Valid characters entered, flag it.
sub.b #'0',d0
cmp.b #$9,d0
bls atol4
sub.b #'A'-'9'-1,d0
atol4 ext d0 ; To long.
ext.l d0
asl.l #4,d1 ; Tack it onto D1.
add.l d0,d1
bra atol1
atolend rts
page
data
*************************************************************************
* *
* Target processor's data registers. *
* Fake FDOS. *
* *
*************************************************************************
even
regop3 equ -9 ; Operand 1 for DAA storage.
regb equ -8 ; Offsets from register base pointer for
regc equ -7 ; 8080's pseudo-registers.
regd equ -6 ; A & F are in Data Registers.
rege equ -5 ; Pseudo-PC is kept in an Address Register.
regh equ -4
regl equ -3
regop1 equ -2 ; Operand 1 for DAA storage.
regop2 equ -1 ; " 2 " " "
fcbstor ds.b 36 ; Host works FCB's out of here.
fcbflag ds.b 1 ; Flag says we used the FCB buffer.
even
tracesad ds.l 1 ; Trace start address.
traceead ds.l 1 ; Trace end address.
traceflg ds.w 1 ; Tracing enabled flag.
dmaaddr ds.l 1 ; DMA address storage.
page
fdos dc.b $76,0,$C9 ; Fake BDOS for target system.
* ; BIOS Jump Table
dc.b $C3,$33,$FF ; Wboot
dc.b $C3,$36,$FF ; Const
dc.b $C3,$39,$FF ; Conin
dc.b $C3,$3C,$FF ; Conout
dc.b $C3,$3F,$FF ; List
dc.b $C3,$42,$FF ; Punch
dc.b $C3,$45,$FF ; Reader
dc.b $C3,$48,$FF ; Home
dc.b $C3,$4B,$FF ; Seldsk
dc.b $C3,$4E,$FF ; Settrk
dc.b $C3,$51,$FF ; Setsec
dc.b $C3,$54,$FF ; Setdma
dc.b $C3,$57,$FF ; Read
dc.b $C3,$5A,$FF ; Write
dc.b $C3,$5D,$FF ; Listst
dc.b $C3,$60,$FF ; Sectran
dc.b $76,1,$C9 ; Fake BIOS for target system
dc.b $76,2,$C9 ; Const
dc.b $76,3,$C9 ; Conin
dc.b $76,4,$C9 ; Conout
dc.b $76,5,$C9 ; List
dc.b $76,6,$C9 ; Punch
dc.b $76,7,$C9 ; Reader
dc.b $76,8,$C9 ; Home *
dc.b $76,9,$C9 ; Seldsk *
dc.b $76,10,$C9 ; Settrk *
dc.b $76,11,$C9 ; Setsec *
dc.b $76,12,$C9 ; Setdma *
dc.b $76,13,$C9 ; Read *
dc.b $76,14,$C9 ; Write *
dc.b $76,15,$C9 ; Listst
dc.b $76,16,$C9 ; Sectran *
fdoslen equ *-fdos
page
*************************************************************************
* *
* Messages. *
* *
*************************************************************************
illgmsg dc.b $d,$a,'Illegal instruction $'
ilgmsg2 dc.b ' at $'
ilgmsg3 dc.b '.$'
dumpmsg dc.b $d,$a,'Register contents:$'
dmpmsg2 dc.b $d,$a
dc.b '-AF- -BC- -DE- -HL- -SP- -S0- -S1- -S2- -S3- -PC- -op-',$d,$a,'$'
biosmsg dc.b $d,$a,'Illegal BIOS call $'
biosmg2 dc.b '.$'
tracemsg dc.b 13,10,'Start trace at >$'
tracemg2 dc.b 13,10,'End trace at >$'
opnmsg dc.b 'Cannot open .COM file.$'
ilgbdos dc.b 'Unsupported BDOS call.$'
fcbmsg dc.b 9,'Fn# Dr NAME EX S1 S2 RC CR R0 R1 R2 Addr Rslt',10,13
dc.b 9,'----------------------------------------------------------',10,13,0
page
bss
*************************************************************************
* *
* Target processor's address space. *
* *
*************************************************************************
even
registers ds.b 10 ; Actual storage for 8080's other registers.
target ds.b $10000 ; 8080's universe.
junkbuf ds.b $80 ; For BDOS' OPEN faking (RREAD buffer).
.end